{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 14.5 2012 Federal Election Commission Database（2012联邦选举委员会数据库）\n",
    "\n",
    "这个选举数据库对于政治宣传很有用。里面包含了支持者的名字，职业和雇主，地址，赞助金额。一个有意思的数据集是关于2012年美国总统选举的。这个数据集有150MB，名称为P00000001-ALL.csv。（译者：因为github对于单个文件的上传限额是100MB，所以这个数据集无法推送到github上，这里我是把数据集压缩成了ZIP格式，解压后能正常导入）。我们用pandas来加载这个数据集："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pd.options.display.max_rows = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "fec = pd.read_csv('../datasets/fec/P00000001-ALL.csv', low_memory=False)\n",
    "# 不设定low_memory=False的话会报错"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1001731 entries, 0 to 1001730\n",
      "Data columns (total 16 columns):\n",
      "cmte_id              1001731 non-null object\n",
      "cand_id              1001731 non-null object\n",
      "cand_nm              1001731 non-null object\n",
      "contbr_nm            1001731 non-null object\n",
      "contbr_city          1001712 non-null object\n",
      "contbr_st            1001727 non-null object\n",
      "contbr_zip           1001620 non-null object\n",
      "contbr_employer      988002 non-null object\n",
      "contbr_occupation    993301 non-null object\n",
      "contb_receipt_amt    1001731 non-null float64\n",
      "contb_receipt_dt     1001731 non-null object\n",
      "receipt_desc         14166 non-null object\n",
      "memo_cd              92482 non-null object\n",
      "memo_text            97770 non-null object\n",
      "form_tp              1001731 non-null object\n",
      "file_num             1001731 non-null int64\n",
      "dtypes: float64(1), int64(1), object(14)\n",
      "memory usage: 122.3+ MB\n"
     ]
    }
   ],
   "source": [
    "fec.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "拿出一份记录来看是什么样子："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cmte_id             C00431445\n",
       "cand_id             P80003338\n",
       "cand_nm         Obama, Barack\n",
       "contbr_nm         ELLMAN, IRA\n",
       "contbr_city             TEMPE\n",
       "                    ...      \n",
       "receipt_desc              NaN\n",
       "memo_cd                   NaN\n",
       "memo_text                 NaN\n",
       "form_tp                 SA17A\n",
       "file_num               772372\n",
       "Name: 123456, Length: 16, dtype: object"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.iloc[123456]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以已经能想到如何切割、整理数据，来提取赞助者的统计数据，或提取宣传活动的模式，这里我们展示一些不同的分析方法。\n",
    "\n",
    "我们可以看到这里面没有政治党派（political party affiliations），所以我们最好添加这样的信息。我们可以使用unique得到所有候选人名单："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bachmann, Michelle', 'Romney, Mitt', 'Obama, Barack',\n",
       "       \"Roemer, Charles E. 'Buddy' III\", 'Pawlenty, Timothy',\n",
       "       'Johnson, Gary Earl', 'Paul, Ron', 'Santorum, Rick', 'Cain, Herman',\n",
       "       'Gingrich, Newt', 'McCotter, Thaddeus G', 'Huntsman, Jon',\n",
       "       'Perry, Rick'], dtype=object)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_cands = fec.cand_nm.unique()\n",
    "unique_cands"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Obama, Barack'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_cands[2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一种标记政党的方法是使用dict："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "parties = {'Bachmann, Michelle': 'Republican',\n",
    "           'Cain, Herman': 'Republican', \n",
    "           'Gingrich, Newt': 'Republican', \n",
    "           'Huntsman, Jon': 'Republican', \n",
    "           'Johnson, Gary Earl': 'Republican', \n",
    "           'McCotter, Thaddeus G': 'Republican', \n",
    "           'Obama, Barack': 'Democrat', \n",
    "           'Paul, Ron': 'Republican', \n",
    "           'Pawlenty, Timothy': 'Republican', \n",
    "           'Perry, Rick': 'Republican', \n",
    "           \"Roemer, Charles E. 'Buddy' III\": 'Republican', \n",
    "           'Romney, Mitt': 'Republican', \n",
    "           'Santorum, Rick': 'Republican'}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用map方法，把这个映射应用到Series对象上，我们可以用候选者名字得到一个政党的数组："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123456    Obama, Barack\n",
       "123457    Obama, Barack\n",
       "123458    Obama, Barack\n",
       "123459    Obama, Barack\n",
       "123460    Obama, Barack\n",
       "Name: cand_nm, dtype: object"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.cand_nm[123456:123461]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123456    Democrat\n",
       "123457    Democrat\n",
       "123458    Democrat\n",
       "123459    Democrat\n",
       "123460    Democrat\n",
       "Name: cand_nm, dtype: object"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.cand_nm[123456:123461].map(parties)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Add it as a column\n",
    "fec['party'] = fec.cand_nm.map(parties)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Democrat      593746\n",
       "Republican    407985\n",
       "Name: party, dtype: int64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec['party'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一些需要注意的地方。首先，这个数据集中包含捐款和退款（退款表示把捐赠的钱退还给捐助者，用负数表示）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True     991475\n",
       "False     10256\n",
       "Name: contb_receipt_amt, dtype: int64"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(fec.contb_receipt_amt > 0).value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了简化之后的分析过程，这里我们只取捐款的数据，不考虑退款的数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fec = fec[fec.contb_receipt_amt > 0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为Barack Obama和Mitt Romney是两个最主要的候选者，所以这里我们单独准备一个子集来包含二人的数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fec_mrbo = fec[fec.cand_nm.isin(['Obama, Barack', 'Romney, Mitt'])]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 Donation Statistics by Occupation and Employer（按职业与雇主划分的捐赠数据）\n",
    "\n",
    "职业与捐赠也是有关系的。例如，律师倾向于给民主党（Democrats）捐更多的钱，而企业主管（business executives）倾向给共和党（Republicans）捐更多的钱。\n",
    "\n",
    "首先，按职业计算捐赠总额："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RETIRED                                   233990\n",
       "INFORMATION REQUESTED                      35107\n",
       "ATTORNEY                                   34286\n",
       "HOMEMAKER                                  29931\n",
       "PHYSICIAN                                  23432\n",
       "INFORMATION REQUESTED PER BEST EFFORTS     21138\n",
       "ENGINEER                                   14334\n",
       "TEACHER                                    13990\n",
       "CONSULTANT                                 13273\n",
       "PROFESSOR                                  12555\n",
       "Name: contbr_occupation, dtype: int64"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.contbr_occupation.value_counts()[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到有些职业是同一种工作类型，指代的是同一个东西。下面用一小段代码来清理一下，把一些职业映射为另一种；注意dict.get方法，它会无视没有映射关系的职业："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/xu/anaconda/envs/py35/lib/python3.5/site-packages/pandas/core/generic.py:3110: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  self[name] = value\n"
     ]
    }
   ],
   "source": [
    "occ_mapping = { \n",
    "    'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED', \n",
    "    'INFORMATION REQUESTED' : 'NOT PROVIDED', \n",
    "    'INFORMATION REQUESTED (BEST EFFORTS)' : 'NOT PROVIDED', \n",
    "    'C.E.O.': 'CEO' \n",
    "}\n",
    "\n",
    "# If no mapping provided, return x \n",
    "f = lambda x: occ_mapping.get(x, x) \n",
    "fec.contbr_occupation = fec.contbr_occupation.map(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "译者：上面这个warning我觉得也有必要好好了解一下，这个网站做了很好的讲解，[Understanding SettingwithCopyWarning in pandas](https://www.dataquest.io/blog/settingwithcopywarning/)。\n",
    "\n",
    "简单的说，pandas会在遇到Chained assignment的情况时，跳出这个SettingWithCopyWarning。Chained assignment指的是`data[data.bidder == 'parakeet2004']['bidderrate'] = 100`这样的情况，即把两个索引操作连在一起。\n",
    "\n",
    "- data[data.bidder == 'parakeet2004']\n",
    "- ['bidderrate'] = 100\n",
    "\n",
    "这两个连续操作是分别独立执行的，一个结束后，另一个才开始。第一个操作是一个访问（access）方法，这个方法会返回一个新的DataFrame。而第二个方法是一个赋值（assignment）方法，这个方法是作用在新产生的DataFrame上，所以这里的100是赋给了新的DataFrame，原始的DataFrame并没有被更改。所以为了防止这样的情况出现，pandas会发出SettingWithCopyWarning，让我们检查一下有没有出错。\n",
    "\n",
    "那就检查一下呗，下面输出fec.contbr_occupation，发现映射关系被正常执行了，所以这里的warning我们可以忽略："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0                               RETIRED\n",
       "1                               RETIRED\n",
       "2                          NOT PROVIDED\n",
       "3                               RETIRED\n",
       "4                               RETIRED\n",
       "                       ...             \n",
       "1001726                    NOT PROVIDED\n",
       "1001727                  BUSINESS OWNER\n",
       "1001728                    NOT PROVIDED\n",
       "1001729    LONGWALL MAINTENANCE FOREMAN\n",
       "1001730                    NOT PROVIDED\n",
       "Name: contbr_occupation, Length: 991475, dtype: object"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.contbr_occupation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对雇主也做同样的映射处理："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/xu/anaconda/envs/py35/lib/python3.5/site-packages/pandas/core/generic.py:3110: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  self[name] = value\n"
     ]
    }
   ],
   "source": [
    "emp_mapping = { \n",
    "    'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED', \n",
    "    'INFORMATION REQUESTED' : 'NOT PROVIDED', \n",
    "    'SELF' : 'SELF-EMPLOYED', \n",
    "    'SELF EMPLOYED' : 'SELF-EMPLOYED', \n",
    "}\n",
    "\n",
    "# If no mapping provided, return x \n",
    "f = lambda x: emp_mapping.get(x, x) \n",
    "fec.contbr_employer = fec.contbr_employer.map(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0                               RETIRED\n",
       "1                               RETIRED\n",
       "2                          NOT PROVIDED\n",
       "3                                  NONE\n",
       "4                                  NONE\n",
       "                       ...             \n",
       "1001726                    NOT PROVIDED\n",
       "1001727    DUFFY EQUIPMENT COMPANY INC.\n",
       "1001728                    NOT PROVIDED\n",
       "1001729                        T.A.C.C.\n",
       "1001730                    NOT PROVIDED\n",
       "Name: contbr_employer, Length: 991475, dtype: object"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.contbr_employer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，我们可以用pivot_table，按政党和职业对数据进行聚合，然后过滤下得到捐赠额大于两百万美元以上的职业："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "by_occupation = fec.pivot_table('contb_receipt_amt', \n",
    "                                index='contbr_occupation',\n",
    "                                columns='party',\n",
    "                                aggfunc='sum')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>party</th>\n",
       "      <th>Democrat</th>\n",
       "      <th>Republican</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>ATTORNEY</th>\n",
       "      <td>11141982.97</td>\n",
       "      <td>7.477194e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CEO</th>\n",
       "      <td>2074974.79</td>\n",
       "      <td>4.211041e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CONSULTANT</th>\n",
       "      <td>2459912.71</td>\n",
       "      <td>2.544725e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ENGINEER</th>\n",
       "      <td>951525.55</td>\n",
       "      <td>1.818374e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>EXECUTIVE</th>\n",
       "      <td>1355161.05</td>\n",
       "      <td>4.138850e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PRESIDENT</th>\n",
       "      <td>1878509.95</td>\n",
       "      <td>4.720924e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PROFESSOR</th>\n",
       "      <td>2165071.08</td>\n",
       "      <td>2.967027e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REAL ESTATE</th>\n",
       "      <td>528902.09</td>\n",
       "      <td>1.625902e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RETIRED</th>\n",
       "      <td>25305116.38</td>\n",
       "      <td>2.356124e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SELF-EMPLOYED</th>\n",
       "      <td>672393.40</td>\n",
       "      <td>1.640253e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>17 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "party                 Democrat    Republican\n",
       "contbr_occupation                           \n",
       "ATTORNEY           11141982.97  7.477194e+06\n",
       "CEO                 2074974.79  4.211041e+06\n",
       "CONSULTANT          2459912.71  2.544725e+06\n",
       "ENGINEER             951525.55  1.818374e+06\n",
       "EXECUTIVE           1355161.05  4.138850e+06\n",
       "...                        ...           ...\n",
       "PRESIDENT           1878509.95  4.720924e+06\n",
       "PROFESSOR           2165071.08  2.967027e+05\n",
       "REAL ESTATE          528902.09  1.625902e+06\n",
       "RETIRED            25305116.38  2.356124e+07\n",
       "SELF-EMPLOYED        672393.40  1.640253e+06\n",
       "\n",
       "[17 rows x 2 columns]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "over_2mm = by_occupation[by_occupation.sum(1) > 2000000]\n",
    "over_2mm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "画出柱状图，barh表示水平柱状图："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x12bd7d630>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11eb7df60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "over_2mm.plot(kind='barh', figsize=(10, 8))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以能对那些捐款给Obama和Romney的顶级捐助者职业，或顶级捐助公司感兴趣。想要得到这些信息的话，可以按候选者名字进行分组，然后使用top方法的一个变形："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_top_amounts(group, key, n=5):\n",
    "    totals = group.groupby(key)['contb_receipt_amt'].sum()\n",
    "    return totals.nlargest(n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后按职业和雇主聚合："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.DataFrameGroupBy object at 0x12bed7dd8>"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped = fec_mrbo.groupby('cand_nm')\n",
    "grouped"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm        contbr_occupation    \n",
       "Obama, Barack  RETIRED                  25305116.38\n",
       "               ATTORNEY                 11141982.97\n",
       "               INFORMATION REQUESTED     4866973.96\n",
       "               HOMEMAKER                 4248875.80\n",
       "               PHYSICIAN                 3735124.94\n",
       "                                           ...     \n",
       "Romney, Mitt   HOMEMAKER                 8147446.22\n",
       "               ATTORNEY                  5364718.82\n",
       "               PRESIDENT                 2491244.89\n",
       "               EXECUTIVE                 2300947.03\n",
       "               C.E.O.                    1968386.11\n",
       "Name: contb_receipt_amt, Length: 14, dtype: float64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.apply(get_top_amounts, 'contbr_occupation', n=7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm        contbr_employer      \n",
       "Obama, Barack  RETIRED                  22694358.85\n",
       "               SELF-EMPLOYED            17080985.96\n",
       "               NOT EMPLOYED              8586308.70\n",
       "               INFORMATION REQUESTED     5053480.37\n",
       "               HOMEMAKER                 2605408.54\n",
       "                                           ...     \n",
       "Romney, Mitt   CREDIT SUISSE              281150.00\n",
       "               MORGAN STANLEY             267266.00\n",
       "               GOLDMAN SACH & CO.         238250.00\n",
       "               BARCLAYS CAPITAL           162750.00\n",
       "               H.I.G. CAPITAL             139500.00\n",
       "Name: contb_receipt_amt, Length: 20, dtype: float64"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.apply(get_top_amounts, 'contbr_employer', n=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2 Bucketing Donation Amounts（桶捐赠额）\n",
    "\n",
    "一个分析这种数据的有用方法是使用cut函数，把捐赠额去中心化，按捐赠额大小分为多个桶："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "bins = np.array([0, 1, 10, 100, 1000, 10000,\n",
    "                 100000, 1000000, 10000000])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "411         (10, 100]\n",
       "412       (100, 1000]\n",
       "413       (100, 1000]\n",
       "414         (10, 100]\n",
       "415         (10, 100]\n",
       "             ...     \n",
       "701381      (10, 100]\n",
       "701382    (100, 1000]\n",
       "701383        (1, 10]\n",
       "701384      (10, 100]\n",
       "701385    (100, 1000]\n",
       "Name: contb_receipt_amt, Length: 694282, dtype: category\n",
       "Categories (8, interval[int64]): [(0, 1] < (1, 10] < (10, 100] < (100, 1000] < (1000, 10000] < (10000, 100000] < (100000, 1000000] < (1000000, 10000000]]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "labels = pd.cut(fec_mrbo.contb_receipt_amt, bins)\n",
    "labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以按二人的名字和箱标签（bin label）分组，得到按不同捐赠额的直方图："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>493.0</td>\n",
       "      <td>77.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>40070.0</td>\n",
       "      <td>3681.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>372280.0</td>\n",
       "      <td>31853.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>153991.0</td>\n",
       "      <td>43357.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>22284.0</td>\n",
       "      <td>26186.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>3.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                       493.0          77.0\n",
       "(1, 10]                    40070.0        3681.0\n",
       "(10, 100]                 372280.0       31853.0\n",
       "(100, 1000]               153991.0       43357.0\n",
       "(1000, 10000]              22284.0       26186.0\n",
       "(10000, 100000]                2.0           1.0\n",
       "(100000, 1000000]              3.0           NaN\n",
       "(1000000, 10000000]            4.0           NaN"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped = fec_mrbo.groupby(['cand_nm', labels])\n",
    "grouped.size().unstack(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这份数据说明Obama收到的小额捐助是远超Romney的。我们也可以对每一个箱进行归一化，然后得到百分比数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>318.24</td>\n",
       "      <td>77.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>337267.62</td>\n",
       "      <td>29819.66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>20288981.41</td>\n",
       "      <td>1987783.76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>54798531.46</td>\n",
       "      <td>22363381.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>51753705.67</td>\n",
       "      <td>63942145.42</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>59100.00</td>\n",
       "      <td>12700.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>1490683.08</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>7148839.76</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                      318.24         77.00\n",
       "(1, 10]                  337267.62      29819.66\n",
       "(10, 100]              20288981.41    1987783.76\n",
       "(100, 1000]            54798531.46   22363381.69\n",
       "(1000, 10000]          51753705.67   63942145.42\n",
       "(10000, 100000]           59100.00      12700.00\n",
       "(100000, 1000000]       1490683.08           NaN\n",
       "(1000000, 10000000]     7148839.76           NaN"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bucket_sums = grouped.contb_receipt_amt.sum().unstack(0)\n",
    "bucket_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>0.805182</td>\n",
       "      <td>0.194818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>0.918767</td>\n",
       "      <td>0.081233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>0.910769</td>\n",
       "      <td>0.089231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>0.710176</td>\n",
       "      <td>0.289824</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>0.447326</td>\n",
       "      <td>0.552674</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>0.823120</td>\n",
       "      <td>0.176880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                    0.805182      0.194818\n",
       "(1, 10]                   0.918767      0.081233\n",
       "(10, 100]                 0.910769      0.089231\n",
       "(100, 1000]               0.710176      0.289824\n",
       "(1000, 10000]             0.447326      0.552674\n",
       "(10000, 100000]           0.823120      0.176880\n",
       "(100000, 1000000]         1.000000           NaN\n",
       "(1000000, 10000000]       1.000000           NaN"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normed_sums = bucket_sums.div(bucket_sums.sum(axis=1), axis=0)\n",
    "normed_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x134735c50>"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x13474db70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "normed_sums[:-2].plot(kind='barh', figsize=(10, 8))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里没有包含捐款数额最大的两个bins，因为没有Romney这边没有捐款。\n",
    "\n",
    "# 3 Donation Statistics by State（按州划分的捐赠数据）\n",
    "\n",
    "按州划分也是一个比较常见的方法："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "grouped = fec_mrbo.groupby(['cand_nm', 'contbr_st'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AA</th>\n",
       "      <td>56405.00</td>\n",
       "      <td>135.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AB</th>\n",
       "      <td>2048.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AE</th>\n",
       "      <td>42973.75</td>\n",
       "      <td>5680.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>281840.15</td>\n",
       "      <td>86204.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>543123.48</td>\n",
       "      <td>527303.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WI</th>\n",
       "      <td>1130155.46</td>\n",
       "      <td>270316.32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WV</th>\n",
       "      <td>169154.47</td>\n",
       "      <td>126725.12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WY</th>\n",
       "      <td>194046.74</td>\n",
       "      <td>252595.84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>XX</th>\n",
       "      <td>0.00</td>\n",
       "      <td>400250.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ZZ</th>\n",
       "      <td>5963.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>67 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AA              56405.00        135.00\n",
       "AB               2048.00          0.00\n",
       "AE              42973.75       5680.00\n",
       "AK             281840.15      86204.24\n",
       "AL             543123.48     527303.51\n",
       "...                  ...           ...\n",
       "WI            1130155.46     270316.32\n",
       "WV             169154.47     126725.12\n",
       "WY             194046.74     252595.84\n",
       "XX                  0.00     400250.00\n",
       "ZZ               5963.00          0.00\n",
       "\n",
       "[67 rows x 2 columns]"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "totals = grouped.contb_receipt_amt.sum().unstack(0).fillna(0)\n",
    "totals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>281840.15</td>\n",
       "      <td>86204.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>543123.48</td>\n",
       "      <td>527303.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>359247.28</td>\n",
       "      <td>105556.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>1506476.98</td>\n",
       "      <td>1888436.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>23824984.24</td>\n",
       "      <td>11237636.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WA</th>\n",
       "      <td>4250933.16</td>\n",
       "      <td>1341521.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WI</th>\n",
       "      <td>1130155.46</td>\n",
       "      <td>270316.32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WV</th>\n",
       "      <td>169154.47</td>\n",
       "      <td>126725.12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WY</th>\n",
       "      <td>194046.74</td>\n",
       "      <td>252595.84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>XX</th>\n",
       "      <td>0.00</td>\n",
       "      <td>400250.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>52 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK             281840.15      86204.24\n",
       "AL             543123.48     527303.51\n",
       "AR             359247.28     105556.00\n",
       "AZ            1506476.98    1888436.23\n",
       "CA           23824984.24   11237636.60\n",
       "...                  ...           ...\n",
       "WA            4250933.16    1341521.56\n",
       "WI            1130155.46     270316.32\n",
       "WV             169154.47     126725.12\n",
       "WY             194046.74     252595.84\n",
       "XX                  0.00     400250.00\n",
       "\n",
       "[52 rows x 2 columns]"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "totals = totals[totals.sum(1) > 100000]\n",
    "totals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还可以得到每个州，两个候选人获得金额的百分比："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>0.765778</td>\n",
       "      <td>0.234222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>0.507390</td>\n",
       "      <td>0.492610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>0.772902</td>\n",
       "      <td>0.227098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>0.443745</td>\n",
       "      <td>0.556255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>0.679498</td>\n",
       "      <td>0.320502</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CO</th>\n",
       "      <td>0.585970</td>\n",
       "      <td>0.414030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CT</th>\n",
       "      <td>0.371476</td>\n",
       "      <td>0.628524</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DC</th>\n",
       "      <td>0.810113</td>\n",
       "      <td>0.189887</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DE</th>\n",
       "      <td>0.802776</td>\n",
       "      <td>0.197224</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>FL</th>\n",
       "      <td>0.467417</td>\n",
       "      <td>0.532583</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK              0.765778      0.234222\n",
       "AL              0.507390      0.492610\n",
       "AR              0.772902      0.227098\n",
       "AZ              0.443745      0.556255\n",
       "CA              0.679498      0.320502\n",
       "CO              0.585970      0.414030\n",
       "CT              0.371476      0.628524\n",
       "DC              0.810113      0.189887\n",
       "DE              0.802776      0.197224\n",
       "FL              0.467417      0.532583"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "percent = totals.div(totals.sum(1), axis=0)\n",
    "percent[:10]"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [py35]",
   "language": "python",
   "name": "Python [py35]"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
